<?php
class TotalComponent extends Object {	
	var $components = array('Fecha');
	
	function precio_neto($contrato, $meses) {
		App::import('Model', 'TcCobro');
		App::import('Model', 'MgColonia');
		App::import('Model', 'TcAnchoDeBanda');
		$this->TcCobro = new TcCobro();
		$this->MgColonia = new MgColonia();
		$this->TcAnchoDeBanda = new TcAnchoDeBanda();
		
		$precio_unitario = 0;
		$precio_neto = 0;
		
		if($contrato['TcContrato']['tc_tipo_contrato_id'] == 1){
			$cobros = $this->TcCobro->find('first', array('fields'=>array('TcCobro.id', 'valor'), 'conditions'=>array('TcCobro.id'=>2)));
			$colonia_precio = $this->MgColonia->find('first', array('fields'=>array('id','precio', 'descripcion'), 'order'=>'id ASC', 'conditions'=>array('MgColonia.id'=>$contrato['TcContrato']['mg_colonia_id'])));		
			if(isset($colonia_precio))
			{
				$cobros = $this->TcCobro->find('first', array('fields'=>array('TcCobro.id', 'valor', 'porcentaje'), 'conditions'=>array('TcCobro.id'=>2)));
				$tasa_teles =  $cobros['TcCobro']['valor'];
				if ($contrato['TcContrato']['cantidad_televisores'] <= 2) {
					$precio_teles = 0;
				} else {
					$precio_teles = ($contrato['TcContrato']['cantidad_televisores'] - 2) * $tasa_teles;
				}
				$precio_unitario = $colonia_precio['MgColonia']['precio'];
				$precio_neto = $precio_unitario * $meses + $precio_teles;
			}
			
		} else if($contrato['TcContrato']['tc_tipo_contrato_id'] == 2){
			$cobros = $this->TcCobro->find('first', array('fields'=>array('id', 'valor', 'porcentaje'), 'conditions'=>array('TcCobro.id'=>4)));
			if($contrato['TcContrato']['tc_ancho_de_banda_id'] != 0){				
				$banda_precio = $this->TcAnchoDeBanda->find('first', array('fields'=>array('TcAnchoDeBanda.id', 'TcAnchoDeBanda.precio'), 'conditions'=>array('TcAnchoDeBanda.id'=>$contrato['TcContrato']['tc_ancho_de_banda_id'])));
				$precio_unitario = $banda_precio['TcAnchoDeBanda']['precio'];
				$precio_neto = $precio_unitario * $meses;
			}	
		}		
		$data['precio_unitario'] = $precio_unitario;
		$data['precio_neto'] = $precio_neto;
		return $data;
	}
	
	//---------------------------------------------------------------------------------------------
	
	function meses_mora($fecha_corte, $fecha_reinstalacion, $fecha_cancelacion, $fecha_ultimo_pago) {
						
		if (!empty($fecha_corte) && empty($fecha_cancelacion))		
		{
			//echo 'fecha_corte no vacia';
			if (!empty($fecha_reinstalacion))
				if ($this->Fecha->relacion2($fecha_corte,$fecha_reinstalacion,'>'))				
				{
					//echo 'entre aqui';
					return $this->Fecha->restar($fecha_ultimo_pago,$fecha_corte);
				}
		}
		else 
		{					
			if (empty($fecha_corte) && !empty($fecha_cancelacion))
			{	
				//echo 'fecha_cancelacion no vacia';
				return ('0000-00-00');		  			
			}
		}
		//echo $this->Fecha->relacion2($fecha_corte,$fecha_reinstalacion,'>');
		//echo 'todo vacio';
		//echo 'fecha_ultimo pago'.$fecha_ultimo_pago.' ';
		//echo $this->Fecha->restar($fecha_ultimo_pago, $this->Fecha->crear_fecha(9,null,null,null));
		return $this->Fecha->restar($fecha_ultimo_pago, $this->Fecha->crear_fecha(9,null,null,null));
	}
	
    //---------------------------------------------------------------------------------------------
      
	function mora($contrato, $meses, $ref) {
		App::import('Model', 'TcCobro');
		$this->TcCobro = new TcCobro();
		if ($contrato['TcContrato']['tc_estado_contrato_id'] != 3 || !empty($contrato['TcContrato']['fecha_cancelacion'])) {
			$p = $this->precio_neto($contrato, $meses);
			$f = $this->obtener_fechas($contrato, $meses, $ref);
			$hoy = date('Y-m-d');
			$precio_neto = $p['precio_neto'];
			$fecha_inicial = $f['fecha_inicial'];
			$fecha_fin = $f['fecha_fin'];
			$fecha_mora = $f['fecha_mora'];
			$condiciones = array();
			
			//Calcula las tasas de mora correspondientes
			if($contrato['TcContrato']['tc_tipo_contrato_id'] == 1) {
				$condiciones = array('TcCobro.id'=>1);
			} else if($contrato['TcContrato']['tc_tipo_contrato_id'] == 2) {
				$condiciones = array('TcCobro.id'=>4);
			}		
			$cobros = $this->TcCobro->find('first', array('conditions'=>$condiciones));
			$tasa_mora = $cobros['TcCobro']['valor'];
					
			//Calcula la tasa de mora
			if($cobros['TcCobro']['porcentaje'] == 1) {
				$k = $precio_neto * $tasa_mora / 100;
			} else {
				$k = $tasa_mora;
			}
			
			//Calcula la cantidad de meses con mora
			if($this->Fecha->relacion2($fecha_fin, $fecha_mora, '<=')) {			
				$m = $meses;
			} else {			
				$m = $this->Fecha->restar($fecha_inicial, $fecha_mora);			
			}				
			
			//Calcula el monto de la mora
			if($m < 0) {
				$mora = 0;			
			} else {
				$mora = $m * $k;			
			}
		} else {
			$mora = $m = 'N/D';			
		}
		$data['valor_mora'] = $mora;
		$data['meses_mora'] = $m;
		return $data;
	}
		
	//---------------------------------------------------------------------------------------------
	
	function descuento($contrato, $meses, $ref) {
		App::import('Model', 'MgDescuento');
		App::import('Model', 'MgTipoDescuento');
		$this->MgDescuento = new MgDescuento();
		$this->MgTipoDescuento = new MgTipoDescuento();
		$porcentaje_descuento = 0;
		
		$f = $this->obtener_fechas($contrato, $meses, $ref);
		$p = $this->precio_neto($contrato, $meses);
		
		$descuentos = $this->MgDescuento->find('list', array('fields'=>array('mg_tipo_descuento_id'), 'conditions'=>array('MgDescuento.tc_contrato_id'=>$contrato['TcContrato']['id'])));
		$valores_descuentos = $this->MgTipoDescuento->find('list', array('fields'=>array('id', 'valor'), 'conditions'=>array('MgTipoDescuento.id'=>$descuentos)));
		
		foreach($valores_descuentos as $k => $v){
			$porcentaje_descuento += $v;
		}	
		$data['porcentaje_descuento'] = $porcentaje_descuento;
		$data['valor_descuento'] = $p['precio_neto'] * $porcentaje_descuento / 100; 
		return $data;
	}
	
	//---------------------------------------------------------------------------------------------
	
	function meses_adelantados($contrato, $meses, $ref) {
		App::import('Model', 'MgMesesAdelantado');
		$this->MgMesesAdelantado = new MgMesesAdelantado();
		
		$f = $this->obtener_fechas($contrato, $meses, $ref);
		$p = $this->precio_neto($contrato, $meses);
		$dife = 0;
		$adelanto = 0;
		$porcentaje = 0;
		$dife = $this->Fecha->restar($this->Fecha->ahora(), $f['fecha_fin']);
		
		if($dife > 0) {
			if($this->Fecha->relacion($f['fecha_inicial'], $this->Fecha->ahora()) == 1) {
				$dife = $meses;
			}
			$meses_adelantados = $this->MgMesesAdelantado->find('all', array('fields'=>array('id', 'rango_inicial', 'rango_final', 'porcentaje'), 'order by MgMesesAdelantado.id'));
			foreach($meses_adelantados as $k=>$v) {
				if($v['MgMesesAdelantado']['rango_inicial'] <= $dife && $v['MgMesesAdelantado']['rango_final'] >= $dife) {
					$porcentaje = $v['MgMesesAdelantado']['porcentaje'];
					break 1;
				}
			}
			$adelanto = $p['precio_unitario'] * $dife * $porcentaje / 100;
		}
		$data['meses_adelanto'] = $dife;
		$data['valor_adelanto'] = $adelanto;
		return $data;
	}
	
	//---------------------------------------------------------------------------------------------
	
	function obtener_fechas($contrato, $meses, $refer) {
		App::import('Model', 'TcCobro');
		App::import('Model', 'MgDiaProceso');
			
		$this->TcCobro = new TcCobro();
		$this->MgDiaProceso = new MgDiaProceso();		
		
		$ultimo_pago = $contrato['TcContrato']['fecha_ultimo_pago'];
		$f_instalacion = $contrato['TcContrato']['fecha_instalacion'];
		$fecha_corte = $contrato['TcContrato']['fecha_corte'];
		$fecha_reinstalacion = $contrato['TcContrato']['fecha_reinstalacion'];
		
		if(!empty($refer)) {
			$ref = $this->Fecha->formatear($refer);
		} else {
			if($fecha_corte === max($fecha_corte, $ultimo_pago, $fecha_reinstalacion)) {
                $ref = $fecha_corte;
            } else {
                $ref = date('Y-m-d');
            }
		}	
		
		if($ultimo_pago < $fecha_corte && $fecha_corte < $fecha_reinstalacion) {
			$fi = $fecha_reinstalacion;
		} else {
			$fi = $ultimo_pago;
		}		
				
		if($contrato['TcContrato']['tc_tipo_contrato_id'] == 1) {
			$pagox = $this->MgDiaProceso->find('first', array('fields'=>array('id', 'dia'), 'conditions'=>array('descripcion'=>'PAGO')));
			$cortex = $this->MgDiaProceso->find('first', array('fields'=>array('id', 'dia'), 'conditions'=>array('descripcion'=>'MORA')));	
			$cobros = $this->TcCobro->find('first', array('fields'=>array('TcCobro.id', 'valor', 'porcentaje'), 'conditions'=>array('TcCobro.id'=>1)));
			
			$fecha_inicial = $this->Fecha->crear_fecha($pagox['MgDiaProceso']['dia'], null, null, $fi);
			$fecha_mora = $this->Fecha->crear_fecha($cortex['MgDiaProceso']['dia'],null,null,$ref);
		} else {
			$fecha_inicial = $this->Fecha->agregar($fi, array('m'=>1, 'd'=>-1), 'ymd');
			$fecha_mora = $this->Fecha->agregar($fecha_inicial, array('d'=>1), 'dmy');
		}			
		$fecha_inicial = $this->Fecha->agregar_mes($fecha_inicial, 1, 'ymd');
		$fecha_fin = $this->Fecha->agregar_mes($fecha_inicial, $meses-1, 'ymd');
		$fecha_prox = $this->Fecha->agregar_mes($fecha_fin, 1, 'ymd');		
		
		$data['fecha_inicial'] = $fecha_inicial;
		$data['fecha_fin'] = $fecha_fin;
		$data['fecha_corte'] = $fecha_corte;
		$data['fecha_mora'] = $fecha_mora;		
		$data['fecha_referencia'] = $ref;
		$data['fecha_prox'] = $fecha_prox;
		return $data;
	}
	
	//---------------------------------------------------------------------------------------------
	
	function variables($vars) {
		App::import('Model', 'TcCobro');				
		$this->TcCobro = new TcCobro();
		
		$contrato = $vars['contrato'];
		$meses = $vars['meses'];
		$ref = $vars['referencia'];				
		$contrato_tipo = $contrato['TcContrato']['tc_tipo_contrato_id'];		
		$p = $this->precio_neto($contrato, $meses);
		$f = $this->obtener_fechas($contrato, $meses, $ref);
		$d = $this->descuento($contrato, $meses, $ref);
		$a = $this->meses_adelantados($contrato, $meses, $ref);
		$m = $this->mora($contrato, $meses, $ref);
				
		$data['contrato'] = $contrato['TcContrato']['id'];
		$data['fecha_inicial'] = $f['fecha_inicial'];
		$data['fecha_fin'] = $f['fecha_fin'];
		$data['fecha_corte'] = $f['fecha_corte'];
		$data['fecha_mora'] = $f['fecha_mora'];
		$data['fecha_referencia'] = $f['fecha_referencia'];
		$data['fecha_prox'] = $f['fecha_prox'];
		$data['meses_adelanto'] = $a['meses_adelanto'];
		$data['valor_adelanto'] = $a['valor_adelanto'];
		$data['valor_descuento'] = $d['valor_descuento'];
		$data['porcentaje_descuento'] = $d['porcentaje_descuento'];
		$data['valor_mora'] = $m['valor_mora'];
		$data['meses_mora'] = $m['meses_mora'];
		$data['precio_unitario'] = $p['precio_unitario'];
		$data['precio_neto'] = $p['precio_neto'];
		$data['total'] = $data['precio_neto'] - $data['valor_descuento'] + $data['valor_mora'] - $data['valor_adelanto'];
		return $data;		
	}
}
	